package com.zhisheng.users.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhisheng.exception.MyBusinessException;
import com.zhisheng.users.mapper.UsersMapper;
import com.zhisheng.users.entity.Users;
import com.zhisheng.users.service.UsersService;
import com.zhisheng.utils.MyJwtUtils_0_9_1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Service;

/**
 * (Users)表服务实现类
 *
 * @author 全哥
 * @since 2025-02-22 10:49:23
 */
@Service("usersService")
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {

    @Autowired
    private MyJwtUtils_0_9_1 jwtUtils091;

    @Override
    public String mysave(Users users) {
        /*
            1: 填充 0;(如果数据库有默认值约束,可以省略这一步)
            2: 对密码加密;(对数据的合法性进行校验)
            3: 保存到数据库;
         */
        //2: 对密码加密;(对数据的合法性进行校验)
        users.setPassword(BCrypt.hashpw(users.getPassword(), BCrypt.gensalt()));
        if (this.save(users)) {
            return users.getUsername()+"注册成功";
        }
        return users.getUsername()+"注册失败,请重试!";
    }

    @Override
    public String login(Users users) {
        /*
            1: 从users中获取用户名,并根据用户名从数据库中查询结果
            2: 如果查询失败,则直接返回,提示用户名不存在
            3: 如果查询成功,则进行密码校验
            4: 如果校验成功,则生成令牌,令牌中保存当前登陆用户的json字符串,
            5: 否则返回失败

            以上所有的失败,通过异常的方式提示!~
         */
        //1: 从users中获取用户名,并根据用户名从数据库中查询结果
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getUsername, users.getUsername());
        Users one = getOne(queryWrapper);
        //2: 如果查询失败,则直接返回,提示用户名不存在
        if(one == null){
            throw new MyBusinessException("用户名不存在!");
        }
        //3: 如果查询成功,则进行密码校验
        if(BCrypt.checkpw(users.getPassword(),one.getPassword())){
            //4: 如果校验成功,则生成令牌,令牌中保存当前登陆用户的json字符串,
            one.setPassword(null);
            String string = JSONObject.toJSONString(one);
            return jwtUtils091.createToken(string);
        }
        //5: 否则返回失败
        throw new MyBusinessException("密码不对!");
    }
}

